#ifndef SAFEQUEUE_H
#define SAFEQUEUE_H

#include <QMainWindow>
#include <QImage>
#include <QMutex>
#include <QWaitCondition>
#include <QQueue>

class SafeQueue : public QObject
{
    Q_OBJECT
public:
    SafeQueue(int capacity = 15, QObject* parent = nullptr);
    ~SafeQueue();

    // 向队列添加图像（队列满时等待）
    bool enqueue(const QImage& image);
    // 从队列获取图像（队列空时等待）
    bool dequeue(QImage& image);
    // 获取当前队列大小
    int size() const;
    // 检查队列是否为空
    bool isEmpty() const;
    // 检查队列是否已满
    bool isFull() const;
    // 清空队列
    void clear();
    // 线程停止时，唤醒所有等待的线程
    void wakeAll();
    // 重置队列状态
    void reset();

signals:
    // 队列已满信号
    void queueFull();

private:
    QQueue<QImage> queue_;              // 图像队列
    mutable QMutex mutex_;              // 队列访问锁
    QWaitCondition notFull_;            // 队列未满条件变量
    QWaitCondition notEmpty_;           // 队列非空条件变量
    int capacity_;                      // 队列大小
    bool warningSign_;                  // 警告是否已显示
    bool stopped_;                      // 停止标志
};

#endif // SAFEQUEUE_H
